# 第8周作业
# 写一个查询成绩程序，程序中定义一个类，类里面有验证函数，写文件函数和读文件函数。
# 当程序运行时，询问用什么角色登陆。
# 然后输入用户名和密码验证，验证错误三次，提示密码锁定，无法登陆，但是可以用其他用户登录。
# 角色有老师和学生。
# 然后询问需要查询的名称，如果可以查到该用户，返回该用户的语文、数学、英语的成绩。
# 如果没有，学生角色提示是否查询下一个，不查询就退出。
# 如果是教师角色，则提示是否输入该用户成绩，
# 是，则进入输入成绩步骤，输入完成后，将成绩保存到文件中。
# 否，则询问是否继续查询。
# 如果继续查询，则进入查询步骤，如果不查询，则退出
import json
class Score:
    def __init__(self,path='score.txt'):
        self.disableUser = set()
        self.__path = path
        self.studentScoreDict = {}
        self.id = 0
        self.__addStudentScore = {}
        self.__addSubject = {}

    def __initScoreDict(self):
        with open(self.__path) as f:
            for i,line in enumerate(f):
                lineObj = json.loads(line)
                self.studentScoreDict[i] = lineObj
    #  校验当前登录用户的身份
    def checkId(self,id):
        if id == int(1):
            self._id = 1
        elif id == int(2):
            self._id = 2
        else:
            print('非法数据')

    # 校验登录是否成功
    def checkLogin(self,username,password):
        if username == 'student' and password == '123' and self._id == 2:
            print('学生登录成功')
        elif username == 'teacher' and password == '123' and self._id == 1:
            print('教师登录成功')
        else:
            return False
        return True

    def inputUsername(self,type = 1):
        if type == 1:
            username = input('请输入用户名：')
        elif type == 2:
            username = input('请输入需要查询的用户名：')
        return username

    def inputPassword(self):
        password = input('请输入登录密码：')
        return password


    def login(self):
        i = 0
        username = self.inputUsername()
        if username in score.disableUser:
            print('当前用户以被禁止登录，请切换其他用户')
            self.login()
        while i < 3:
            password = self.inputPassword()
            loginRes = self.checkLogin(username, password)
            if loginRes:
                return {'loginRes':True,'username':username}
            i += 1
        else:
            return {'loginRes':False,'username':username}

    # 记录当前被禁止登录的用户
    def lockUser(self,username):
        self.disableUser.add(username)

    def isContinue(self,type = 1):
        res = 0
        if type == 1:
            res = input('是否切换其他身份登录(1:切换，其他:退出程序)：')
        elif type == 2:
            res = input('是否继续查询其他姓名(1:继续，其他:退出程序)：')
        elif type == 3:
            res = input('当前用户不存在，是否继续查询(1:继续，其他:退出程序)：')
        elif type == 4:
            res = input('当前用户未被录入，是否添加该用户的成绩(1:添加，其他:不追加)：')
        elif type == 5:
            res = input('是否继续追加当前学生成绩：(1:追加，其他:退出程序)：')
        if res == '1':
            res = 1
        else:
            res = 0
        return res

    def __setScoreForStudent(self,name):
        while True:
            subject = input('请输入科目(英文)：')
            score = int(input('请输入成绩：'))
            self.__addSubject[subject] = score
            self.__addStudentScore[name] = self.__addSubject
            res = self.isContinue(5)
            if not res:
                break
        with open(self.__path,'a+',encoding='utf8') as f:
            jsonRes = json.dumps(self.__addStudentScore)
            f.write('\n'+jsonRes)

        return True

    def getScore(self,type = 2):
        name = self.inputUsername(type)
        self.__initScoreDict()
        for i,score in self.studentScoreDict.items():
            if name in score.keys():
                return {'res':True,'score':score[name],'username':name}
        else:
            if self._id == 2:
                res = self.isContinue(3)
                if res:
                    return self.getScore()
                else:
                    return {'res': False}
            elif self._id == 1:
                res = self.isContinue(4)
                # 是否追加成绩
                if res:
                    res = self.__setScoreForStudent(name)
                # 是否继续查询
                if res:
                    return self.getScore()
                else:
                    return {'res': False}

# score = Score()
# score.setScoreForStudent('qiao')


while True:
    score = Score()
    user = input('请输入登录角色身份(1,教师，2,学生)：')
    user = int(user)
    score.checkId(user)
    # 然后输入用户名和密码验证，验证错误三次，提示密码锁定，无法登陆，但是可以用其他用户登录。
    loginRes = score.login()
    if not loginRes['loginRes']:
        score.lockUser(loginRes['username'])
        isContinue = score.isContinue()
        if isContinue == 1:
            score.login()
        else:
            break
#     成功登录
    res = score.getScore()
    # print(res)
    if res['res']:
        for key,sc in res['score'].items():
            print(key,sc)
    break





